package org.example.request;

import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.QueryStringDecoder;
import io.netty.handler.codec.http.cookie.Cookie;
import lombok.Getter;
import org.asynchttpclient.Request;
import org.asynchttpclient.RequestBuilder;

import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;

public class GatewayRequest implements IGatewayRequest{
    @Getter
    private final String uniqueId; // 服务唯一ID
    @Getter
    private final long beginTime; // 进入网关的开始时间
    @Getter
    private final long endTime; // 进入网关的结束时间
    @Getter
    private final Charset charset; // 字符集
    @Getter
    private final String clientIp; // 客户端ip
    @Getter
    private final String host; // 服务端主机
    @Getter
    private final String path; // 服务端请求经 /XX/XX 不包括请求参数
    @Getter
    private final String uri; // 统一资源标识符  路径加请求参数 /XX/XX/XX?key=value
    @Getter
    private final HttpMethod httpMethod; // 请求方式
    @Getter
    private final HttpMethod contetnType; // 请求格式
    @Getter
    private final HttpHeaders httpHeaders; // 请求头
    @Getter
    private final QueryStringDecoder queryStringDecoder; // 参数解析器
    /**
     * 在HTTP通信中，一个完整的请求由请求行、请求头和消息体组成。HttpRequest接口提供了表示请求行和请求头的功能，
     * 而FullHttpMessage接口提供了表示消息体的功能。通过FullHttpRequest接口，Netty将这两个接口合并在一起，
     * 使得一个对象可以同时表示请求行、请求头和消息体，从而形成一个完整的HTTP请求。
     *
     * 使用FullHttpRequest接口，可以方便地获取和操作HTTP请求的各个部分，而无需单独处理请求行、
     * 请求头和消息体。这样，开发人员可以更加便捷地处理和解析HTTP请求，同时提供了更高层次的抽象和功能。
     */
    @Getter
    private final FullHttpRequest fullHttpRequest; // 请求是否满足完整http请求，算是以及校验
    @Getter
    private  String body; // 请求体
    @Getter
    private  Map<String, Cookie> cookieMap; // cookie

    @Getter
    private  Map<String, List<String>> postParamaters;
    private String modifyHost; // 可修改的主机名
    private String modifyPath; // 可修改的路径

    private final RequestBuilder requestBuilder; // 构建下游请求

    public GatewayRequest(String uniqueId, long beginTime, long endTime, Charset charset, String clientIp, String host, String path, String uri, HttpMethod httpMethod, HttpMethod contetnType, HttpHeaders httpHeaders, QueryStringDecoder queryStringDecoder, FullHttpRequest fullHttpRequest, RequestBuilder requestBuilder) {
        this.uniqueId = uniqueId;
        this.beginTime = beginTime;
        this.endTime = endTime;
        this.charset = charset;
        this.clientIp = clientIp;
        this.host = host;
        this.path = path;
        this.uri = uri;
        this.httpMethod = httpMethod;
        this.contetnType = contetnType;
        this.httpHeaders = httpHeaders;
        this.queryStringDecoder = queryStringDecoder;
        this.fullHttpRequest = fullHttpRequest;
        this.requestBuilder = requestBuilder;
    }

    private String modifyScheme; // 可修改的Scheme，默认为http

    @Override
    public void setModifyHost(String host) {

    }

    @Override
    public String getModifyHost() {
        return null;
    }

    @Override
    public void setModifyPath(String path) {

    }

    @Override
    public String getModifyPath() {
        return null;
    }

    @Override
    public void addHeader(CharSequence name, String value) {

    }

    @Override
    public void setHeader(CharSequence name, String value) {

    }

    @Override
    public void addQueryParam(String name, String value) {

    }

    @Override
    public void addFormParam(String name, String value) {

    }

    @Override
    public void addOrReplaceCooie(Cookie cookie) {

    }

    @Override
    public void setRequestTimeout(int requestTimeout) {

    }

    @Override
    public String getFinalUrl() {
        return null;
    }

    @Override
    public Request build() {
        return null;
    }
}
